package com.boil.qz.safekavass.service;

import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.dao.MybatisDao;
import com.boil.qz.safekavass.model.ReportRes;
import com.boil.qz.safekavass.model.WeixinSendredpack;
import com.boil.qz.safekavass.pojo.ReportCountByReceiveredpackMonthVo;
import com.boil.qz.safekavass.pojo.ReportCountByReportMonthVo;
import com.boil.qz.safekavass.pojo.ReportCountBySendredpackMonthVo;
import com.boil.qz.safekavass.pojo.ReportResVo;
import com.boil.qz.safekavass.web.request.param.ReportWeixinSendredpackParam;
import com.boil.util.Constants;
import com.boil.util.DateUtils;
import com.boil.util.Page;
import com.boil.util.Page1;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * Created by ChenYong on 2017-04-17.
 * <br>
 * 举报 Service。
 */
@Service
public class ReportResService {
    /**
     * 注入 Mybatis Dao
     */
    @Autowired
    private MybatisDao mybatisDao;
    /**
     * 注入微信发普通红包 Service
     */
    @Autowired
    private WeixinSendredpackService weixinSendredpackService;

    /**
     * 保存举报。
     *
     * @param loingUserId 登录用户 ID
     * @param reportRes   举报
     * @return 保存记录数
     */
    public int saveReportRes(long loingUserId, ReportRes reportRes) {
        int saveCount = Constants.VALUE_0;

        if ((loingUserId != Constants.VALUE_L_0) && (reportRes != null)) {
            saveCount = mybatisDao.insert("reportResNs.save", reportRes);

            saveReportResRecord(loingUserId, reportRes.getId(), reportRes.getReportResult(), reportRes.getReportCreateTime());
        }

        return saveCount;
    }

    /**
     * 保存举报处理流程记录。
     *
     * @param reportHandlePersonId 处理人 ID
     * @param reportId             举报 ID
     * @param reportResult         举报结果
     * @param handleTime           处理时间
     * @return 保存记录数
     */
    public int saveReportResRecord(long reportHandlePersonId, long reportId, String reportResult, Date handleTime) {
        if ((reportHandlePersonId == Constants.VALUE_L_0) || //
                (reportId == Constants.VALUE_L_0) || //
                StringUtils.isBlank(reportResult) || //
                (handleTime == null)) {
            return Constants.VALUE_0;
        }

        Map<String, Object> param = new HashMap<String, Object>();
        param.put("userId", reportHandlePersonId);
        param.put("reportId", reportId);
        param.put("reportResult", reportResult);
        param.put("createTime", handleTime);

        return mybatisDao.insert("reportResNs.saveRecord", param);
    }

    /**
     * 保存举报微信发普通红包。
     *
     * @param reportId  举报 ID
     * @param mchBillno 商户订单号
     * @return 保存记录数
     */
    public int saveReportWeixinSendredpack(long reportId, String mchBillno) {
        if ((reportId == Constants.VALUE_L_0) || StringUtils.isBlank(mchBillno)) {
            return Constants.VALUE_0;
        }

        Map<String, Object> param = new HashMap<String, Object>();
        param.put("reportId", reportId);
        param.put("mchBillno", mchBillno);

        return mybatisDao.insert("reportResNs.saveReportWeixinSendredpack", param);
    }


    /**
     * 根据 ID 查询举报。
     *
     * @param id ID 编号
     * @return 返回举报
     */
    public ReportRes findById(long id) {
        Map<String, Object> map = new HashMap<String, Object>();

        map.put("id", id);

        return mybatisDao.selectOne("reportResNs.findById", map);
    }

    /**
     * 分页查询举报。
     *
     * @param page 分页实例
     */
    public void findInPage(Page<ReportResVo> page) {
        mybatisDao.selectInPage("reportResNs.findInPage", page);
    }

    /**
     * 根据 openid 查询分页查询举报。
     *
     * @param page1 分页实例
     */
    public void findInPageByOpenid(Page1<ReportResVo> page1) {
        mybatisDao.selectInPage("reportResNs.findInPageByOpenid", page1);
    }

    /**
     * 根据举报月份统计举报情况。
     *
     * @param reportMonth 举报月份
     * @return 根据举报月份统计举报情况的实例集合
     */
    public List<ReportCountByReportMonthVo> findCountByReportMonth(String reportMonth) {
        if (StringUtils.isBlank(reportMonth)) {
            return new ArrayList<ReportCountByReportMonthVo>();
        }

        Map<String, Object> map = new HashMap<String, Object>();
        map.put(Constants.MONTH_STR, reportMonth);

        return mybatisDao.selectList("reportResNs.findCountByReportMonth", map);
    }

    /**
     * 根据发红包月份统计红包发放情况。
     *
     * @param sendredpackMonth 发红包月份
     * @return 根据发红包月份统计红包发放情况的实例集合
     */
    public List<ReportCountBySendredpackMonthVo> findCountBySendredpackMonth(String sendredpackMonth) {
        if (StringUtils.isBlank(sendredpackMonth)) {
            return new ArrayList<ReportCountBySendredpackMonthVo>();
        }

        Map<String, Object> map = new HashMap<String, Object>();
        map.put(Constants.MONTH_STR, sendredpackMonth);

        return mybatisDao.selectList("reportResNs.findCountBySendredpackMonth", map);
    }

    /**
     * 根据领红包月份统计红包领取情况。
     *
     * @param receiveredpackMonth 领红包月份
     * @return 根据领红包月份统计红包领取情况的实例集合
     */
    public List<ReportCountByReceiveredpackMonthVo> findCountByReceiveredpackMonth(String receiveredpackMonth) {
        if (StringUtils.isBlank(receiveredpackMonth)) {
            return new ArrayList<ReportCountByReceiveredpackMonthVo>();
        }

        Map<String, Object> map = new HashMap<String, Object>();
        map.put(Constants.MONTH_STR, receiveredpackMonth);

        return mybatisDao.selectList("reportResNs.findCountByReceiveredpackMonth", map);
    }

    /**
     * 更新举报。
     *
     * @param loingUserId  登录用户 ID
     * @param reportId     举报 ID
     * @param reportResult 举报结果
     * @return 更新的记录
     */
    public int updateById(long loingUserId, long reportId, String reportResult) {
        int updateCount = Constants.VALUE_0;

        if ((loingUserId != Constants.VALUE_L_0) && (reportId != Constants.VALUE_L_0) && StringUtils.isNotBlank(reportResult)) {
            Map<String, Object> param = new HashMap<String, Object>();
            param.put("id", reportId);
            param.put("reportResult", reportResult);

            updateCount = mybatisDao.update("reportResNs.updateById", param);

            if (updateCount > Constants.VALUE_0) {
                saveReportResRecord(loingUserId, reportId, reportResult, DateUtils.getCurrDate());
            }
        }

        return updateCount;
    }

    /**
     * 更新举报奖金。
     *
     * @param id          举报 ID
     * @param reportMoney 举报奖金
     * @return 更新的记录
     */
    public int updateReportMoneyById(long id, String reportMoney) {
        if (StringUtils.isBlank(reportMoney)) {
            return Constants.VALUE_0;
        }

        Map<String, Object> param = new HashMap<String, Object>();
        param.put("id", id);
        param.put("reportMoney", reportMoney);

        return mybatisDao.update("reportResNs.updateReportMoneyById", param);
    }

    /**
     * 处理微信发普通红包。
     *
     * @param resultVo    结果 Vo
     * @param loingUserId 登录用户 ID
     * @param param       举报微信发普通红包的请求参数
     */
    public void doSendredpack(ResultVo resultVo, long loingUserId, ReportWeixinSendredpackParam param) {
        if ((resultVo != null) && (param != null)) {
            // 根据举报 ID 查询举报
            ReportRes reportRes = findById(param.getId());

            // 只有举报结果为“已核实”，才能发红包
            if (Constants.REPORT_RESULT_3.equals(reportRes.getReportResult())) {
                // 举报来源必须是微信
                if (Constants.WEIXIN.equals(reportRes.getReportSource()) && StringUtils.isNotBlank(reportRes.getOpenid())) {
                    WeixinSendredpack weixinSendredpack = new WeixinSendredpack();
                    weixinSendredpack.setRe_openid(reportRes.getOpenid());
                    weixinSendredpack.setTotal_num(Constants.VALUE_1);
                    weixinSendredpack.setRemark(param.getRemark());

                    // 红包的金额未超过限制
                    if (param.getAmountCode() <= Constants.VALUE_5) {
                        // 1 分
                        if (param.getAmountCode() == Constants.VALUE_0) {
                            weixinSendredpack.setTotal_amount(Constants.VALUE_1);

                            // 1 元
                        } else if (param.getAmountCode() == Constants.VALUE_1) {
                            weixinSendredpack.setTotal_amount(Constants.VALUE_1 * Constants.VALUE_100);

                            // 5 元
                        } else if (param.getAmountCode() == Constants.VALUE_2) {
                            weixinSendredpack.setTotal_amount(Constants.VALUE_5 * Constants.VALUE_100);

                            // 10 元
                        } else if (param.getAmountCode() == Constants.VALUE_3) {
                            weixinSendredpack.setTotal_amount(Constants.VALUE_10 * Constants.VALUE_100);

                            // 15 元
                        } else if (param.getAmountCode() == Constants.VALUE_4) {
                            weixinSendredpack.setTotal_amount(Constants.VALUE_15 * Constants.VALUE_100);

                            // 20 元
                        } else {
                            weixinSendredpack.setTotal_amount(Constants.VALUE_20 * Constants.VALUE_100);
                        }

                        weixinSendredpackService.doSendredpack(resultVo, weixinSendredpack);

                        // 发红包成功
                        if (resultVo.getResultCode() == Constants.SUCCESS) {
                            // 保存举报微信发普通红包
                            saveReportWeixinSendredpack(param.getId(), weixinSendredpack.getMch_billno());

                            // 更新举报结果为“已发放”
                            updateById(loingUserId, param.getId(), Constants.REPORT_RESULT_5);

                            // 举报奖金
                            String reportMoney = null;

                            if (weixinSendredpack.getTotal_amount() < Constants.VALUE_100) {
                                reportMoney = String.format("%.2f", (Double.valueOf(weixinSendredpack.getTotal_amount()) / Constants.VALUE_D_100));
                            } else {
                                reportMoney = String.valueOf(weixinSendredpack.getTotal_amount() / Constants.VALUE_100);
                            }

                            // 更新举报奖金
                            updateReportMoneyById(param.getId(), reportMoney);
                        }

                        // 红包的金额已超过限制
                    } else {
                        resultVo.setResultCode(Constants.SENDREDPACK_ERROR);
                        resultVo.setResultMsg(Constants.SENDREDPACK_AMOUNT_EXCEED_20RMB_MSG);
                    }

                    // 举报来源是其他
                } else {
                    resultVo.setResultCode(Constants.SENDREDPACK_ERROR);
                    resultVo.setResultMsg(Constants.REPORT_NOT_WEIXIN_STOP_SENDREDPACK_MSG);
                }

                // 举报结果为其他，禁止发红包
            } else {
                resultVo.setResultCode(Constants.SENDREDPACK_ERROR);
                resultVo.setResultMsg(Constants.REPORT_RESULT_NOT_3_STOP_SENDREDPACK_MSG);
            }
        }
    }
}